package com.iacrqq.sedaf.stage;

import java.util.List;

import com.iacrqq.sedaf.common.Controllable;
import com.iacrqq.sedaf.common.Destroyable;
import com.iacrqq.sedaf.common.Initializable;
import com.iacrqq.sedaf.common.Nameable;
import com.iacrqq.sedaf.common.StageTask;
import com.iacrqq.sedaf.common.ThreadControllable;
import com.iacrqq.sedaf.event.Event;
import com.iacrqq.sedaf.event.EventDispatcher;
import com.iacrqq.sedaf.event.EventHandler;
import com.iacrqq.sedaf.queue.Input;
import com.iacrqq.sedaf.queue.Output;

/**
 * 
 * @author sihai
 *
 */
public interface Stage extends Nameable, Initializable, Destroyable, Controllable, StageTask, ThreadControllable
{
	
	/**
	 * 
	 * @param eventHandler
	 */
	void setEventHandler(EventHandler eventHandler);
	
	/**
	 * 
	 * @param eventDispatcher
	 */
	void setEventDispatcher(EventDispatcher eventDispatcher);
	
	/**
	 * 
	 * @return
	 */
	EventHandler getEventHandler();
	
	/**
	 * 
	 * @return
	 */
	Input<Event> getInput();
	
	/**
	 * 
	 * @return
	 */
	void setOutputs(List<Output<Event>> outputs);
	
	/**
	 * 
	 * @return
	 */
	List<Output<Event>> getOutputs();
	
	/**
	 * 
	 */
	void addOutput(Output<Event> output);
	
	/**
	 * 
	 * @return
	 */
	StageRuntimeStatistics getStageRuntimeStatistics();
}
